from enum import Enum
from typing import List, Set, Dict, Tuple, Optional
import random



from Job  import Job,Operation,ScheduleAssignment
from Machine import Machine
from WaferCassette import Task,WaferCassette
from Constant import Parameter



class MoveType(Enum):
    '''移动类型枚举类'''
    PICK_MOVE = 1  # 机械手取晶圆动作
    PLACE_MOVE = 2  # 机械手放晶圆动作
    TRANS_MOVE = 3  # 机械手移动动作
    PREPARE_MOVE = 4  # 模块开门动作
    COMPLETE_MOVE = 5  # 模块关门动作
    PUMP_MOVE = 6  # LL抽气动作
    VENT_MOVE = 7  # LL充气动作
    PROCESS_MOVE = 8  # 加工或冷却工艺动作
    CLEAN_MOVE = 9  # 清洁工艺动作
    ALIGN_MOVE = 10  # 校准工艺动作



class DataGenerator:
    """数据生成器，用于生成作业、机器和晶圆盒数据"""

    def __init__(self):
        self.task: Task = Task()
        self.jobs: List[Job] = []
        self.machines: List[Machine] = []
        self.wafer_cassettes: List[WaferCassette] = []
        self.wafer_cassette_size: int = 25
        self.wafer_cassette_num: int = 3

    def generate_job_a(self) -> Job:
        """
        工艺路径为A的工件
        LLA-(PM7[70]-PM8[70]-LLC-LLD[70]-LLB)*5
        """

        job = Job()
        job.id = 1
        job.name = "A"

        ''' 加工工序：LLA '''
        op1 = Operation()
        op1.id = 1
        op1.machine_names.append("LLA")
        op1.processing_times.append(1.0 + 15.0 + 1.0)  # 开门+大气态转为真空态+关门
        op1.move_types.append(MoveType.COMPLETE_MOVE.value) #关门
        op1.move_times.append(1.0)
        op1.move_types.append(MoveType.PUMP_MOVE.value) # 抽气
        op1.move_times.append(15.0)
        op1.move_types.append(MoveType.PREPARE_MOVE.value) #开门
        op1.move_times.append(1.0)
        job.operations.append(op1)

        '''运输工序: LLA to PM7 by TM2'''
        op11 = Operation()
        op11.machine_names.append("TM2")
        # TODO : 疑问：LLA - PM7转移时间不应该是1.0吗？
        op11.processing_times.append(Parameter.TAKE_TIME_TM2 + 0.5 + Parameter.PUT_TIME_TM2)  # 取 + 运 + 放
        op11.move_types.append(MoveType.PICK_MOVE.value)  # 机械手取晶圆
        op11.move_times.append(Parameter.TAKE_TIME_TM2)
        op11.move_types.append(MoveType.TRANS_MOVE.value)  # 机械手移动
        op11.move_times.append(0.5)
        op11.move_types.append(MoveType.PLACE_MOVE.value)  # 机械手放晶圆
        op11.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op11)

        for i in range(5):
            '''加工工序：PM7'''
            op2 = Operation()
            op2.id = 2+i
            op2.machine_names.append("PM7")
            op2.processing_times.append(1.0 + 70.0 + 1.0)  #开门 + 加工 + 关门
            op2.move_types.append(MoveType.COMPLETE_MOVE.value)  # PM7模块关阀门
            op2.move_times.append(1.0)
            op2.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工
            op2.move_times.append(70.0)
            op2.move_types.append(MoveType.PREPARE_MOVE.value)  #PM7模块开阀门
            op2.move_times.append(1.0)
            job.operations.append(op2)

            '''PM7对应的运输工序'''
            op22 = Operation()
            op22.machine_names.append("TM2")
            op22.processing_times.append(Parameter.TAKE_TIME_TM2 + 1.5 + Parameter.PUT_TIME_TM2)  # 取 + 运 + 放
            op22.move_types.append(MoveType.PICK_MOVE.value)  # PM7模块关阀门
            op22.move_times.append(Parameter.TAKE_TIME_TM2)
            op22.move_types.append(MoveType.TRANS_MOVE.value)  # 加工
            op22.move_times.append(1.5)
            op22.move_types.append(MoveType.PLACE_MOVE.value)  #PM7模块开阀门
            op22.move_times.append(Parameter.PUT_TIME_TM2)
            job.operations.append(op22)


            '''加工工序：PM8'''
            op3 = Operation()
            op3.id = 3+i
            op3.machine_names.append("PM8")
            op3.processing_times.append(1.0 + 70.0 + 1.0)
            op3.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
            op3.move_times.append(1.0)
            op3.move_types.append(MoveType.PROCESS_MOVE.value)   # 加工
            op3.move_times.append(70.0)
            op3.move_types.append(MoveType.PREPARE_MOVE.value)   # 开门
            op3.move_times.append(1.0)

            '''运输工序：PM8 to LLC by TM2'''
            op33 = Operation()
            op33.machine_names.append("TM2")
            op33.processing_times.append(Parameter.TAKE_TIME_TM2 + 1.0 + Parameter.PUT_TIME_TM2)
            op33.move_types.append(MoveType.PICK_MOVE.value)
            op33.move_times.append(Parameter.TAKE_TIME_TM2)
            op33.move_types.append(MoveType.TRANS_MOVE.value)
            op33.move_times.append(1.0)
            op33.move_types.append(MoveType.PLACE_MOVE.value)
            op33.move_times.append(Parameter.PUT_TIME_TM2)
            job.operations.append(op33)

            '''加工工序：LLC'''
            op4 = Operation()
            op4.id = 4+i
            op4.machine_names.append("LLC")
            op4.processing_times.append(1.0 + 0.0 + 1.0)  # LLC不存在状态转换
            op4.move_types.append(MoveType.COMPLETE_MOVE.value)
            op4.move_times.append(1.0)
            op4.move_types.append(MoveType.PREPARE_MOVE.value)
            op4.move_times.append(1.0)
            job.operations.append(op4)

            '''运输工序：LLC to LLD by TM2'''
            op44 = Operation()
            op44.machine_names.append("TM2")
            op44.processing_times.append(Parameter.TAKE_TIME_TM2 + 0.5 + Parameter.PUT_TIME_TM2)
            op44.move_types.append(MoveType.PICK_MOVE.value)
            op44.move_times.append(Parameter.TAKE_TIME_TM2)
            op44.move_types.append(MoveType.TRANS_MOVE.value)
            op44.move_times.append(0.5)
            op44.move_types.append(MoveType.PLACE_MOVE.value)
            op44.move_times.append(Parameter.PUT_TIME_TM2)
            job.operations.append(op44)

            '''加工工序：LLD'''
            op5 = Operation()
            op5.id = 5+i
            op5.machine_names.append("LLD")
            op5.processing_times.append(1.0 + 70.0 + 1.0)
            op5.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
            op5.move_times.append(1.0)
            op5.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工
            op5.move_times.append(70.0)
            op5.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
            op5.move_times.append(1.0)
            job.operations.append(op5)

            '''运输工序：LLD to LLB by TM2'''
            op55 = Operation()
            op55.machine_names.append("TM2")
            op55.processing_times.append(Parameter.TAKE_TIME_TM2 + 1.5 + Parameter.PUT_TIME_TM2)
            op55.move_types.append(MoveType.PICK_MOVE.value)
            op55.move_times.append(Parameter.TAKE_TIME_TM2)
            op55.move_types.append(MoveType.TRANS_MOVE.value)
            op55.move_times.append(0.5)
            op55.move_types.append(MoveType.PLACE_MOVE.value)
            op55.move_times.append(Parameter.PUT_TIME_TM2)
            job.operations.append(op55)

            '''加工工序：LLB'''
            op6 = Operation()
            op6.id = 6+i
            op6.machine_names.append("LLB")
            # TODO：最后一次LLB没有充气时间吗？
            op6.processing_times.append(1.0 + 0.0)
            op6.move_types.append(MoveType.COMPLETE_MOVE.value)   # 开阀门
            op6.move_times.append(1.0)
            job.operations.append(op6)

            '''
            最后一次循环，不需要op66运输工序
            前面几次循环，LLB加工完成后，需要再运输到PM7，开始新的一轮重复加工
            '''
            if i==4:
                break

            '''运输工序：LLB to PM7 by TM2'''
            op66 = Operation()
            op66.machine_names.append("TM2")
            op66.processing_times.append(Parameter.TAKE_TIME_TM2 + 1.5 + Parameter.PUT_TIME_TM2)
            op66.move_types.append(MoveType.PICK_MOVE.value)
            op66.move_times.append(Parameter.TAKE_TIME_TM2)
            op66.move_types.append(MoveType.TRANS_MOVE.value)
            op66.move_times.append(1.5)
            op66.move_types.append(MoveType.PLACE_MOVE.value)
            op66.move_times.append(Parameter.PUT_TIME_TM2)
            job.operations.append(op66)

        return job

    def generate_job_a_no_tm(self) -> Job:
        """
        不含运输的 A 类工件
        LLA-(PM7[70]-PM8[70]-LLC-LLD[70]-LLB)*5
        """

        job = Job()
        job.id = 1
        job.name = "A"  # 标记为不含TM步骤的作业

        '''加工工序：LLA'''
        op1 = Operation()
        op1.id = 1
        op1.machine_names.append("LLA")
        op1.processing_times.append(1.0 + 15.0 + 1.0)  # 关门+抽气+开阀门
        op1.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
        op1.move_times.append(1.0)
        op1.move_types.append(MoveType.PUMP_MOVE.value)  # 抽气
        op1.move_times.append(15.0)
        op1.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
        op1.move_times.append(1.0)
        job.operations.append(op1)

        '''加工任务：(PM7[70]-PM8[70]-LLC-LLD[70]-LLB)*5'''
        for i in range(5):
            '''加工工序：PM7'''
            op2 = Operation()
            op2.id = 2 + i
            op2.machine_names.append("PM7")
            op2.processing_times.append(1.0 + 70.0 + 1.0)  # 开门+加工+关门
            op2.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
            op2.move_times.append(1.0)
            op2.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工
            op2.move_times.append(70.0)
            op2.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
            op2.move_times.append(1.0)
            job.operations.append(op2)

            '''加工工序：PM8'''
            op3 = Operation()
            op3.id = 3 + i
            op3.machine_names.append("PM8")
            op3.processing_times.append(1.0 + 70.0 + 1.0)
            op3.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
            op3.move_times.append(1.0)
            op3.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工
            op3.move_times.append(70.0)
            op3.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
            op3.move_times.append(1.0)
            job.operations.append(op3)

            '''加工工序：LLC'''
            op4 = Operation()
            op4.id = 4 + i
            op4.machine_names.append("LLC")
            op4.processing_times.append(1.0 + 0.0 + 1.0)  # LLC无处理时间
            op4.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
            op4.move_times.append(1.0)
            op4.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
            op4.move_times.append(1.0)
            job.operations.append(op4)

            '''加工工序：LLD'''
            op5 = Operation()
            op5.id = 5 + i
            op5.machine_names.append("LLD")
            op5.processing_times.append(1.0 + 70.0 + 1.0)
            op5.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
            op5.move_times.append(1.0)
            op5.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工
            op5.move_times.append(70.0)
            op5.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
            op5.move_times.append(1.0)
            job.operations.append(op5)

            '''加工工序：LLB'''
            op6 = Operation()
            op6.id = 6 + i
            op6.machine_names.append("LLB")
            op6.processing_times.append(1.0 + 0.0)  # LLB无处理时间
            op6.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
            op6.move_times.append(1.0)
            job.operations.append(op6)

            # 终止条件：完成5次循环后退出
            if i == 4:
                break

        return job

    def generate_job_b(self) -> Job:
        """
        工艺路径为B的工件
        LLA/LLB-PM7/PM8[70]-LLC-PM1/PM2[300]-LLD[70]-LLA/LLB
        """
        job = Job()
        job.id = 1
        job.name = "B"

        '''加工工序：LLA/LLB'''
        op1 = Operation()
        op1.id = 1
        op1.machine_names.append("LLA")
        op1.processing_times.append(1.0 + 15.0 + 1.0)  # 开门+抽气+关门
        op1.machine_names.append("LLB")
        op1.processing_times.append(1.0 + 15.0 + 1.0)  # 开门+抽气+关门
        op1.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
        op1.move_times.append(1.0)
        op1.move_types.append(MoveType.PUMP_MOVE.value)  # 抽气
        op1.move_times.append(15.0)
        op1.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
        op1.move_times.append(1.0)
        job.operations.append(op1)

        '''运输工序：LLA/LLB to PM7/PM8 by TM2'''
        op11 = Operation()
        op11.machine_names.append("TM2")
        op11.processing_times.append(Parameter.TAKE_TIME_TM2 + 1.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op11.move_types.append(MoveType.PICK_MOVE.value)  # 取晶圆
        op11.move_times.append(Parameter.TAKE_TIME_TM2)
        op11.move_types.append(MoveType.TRANS_MOVE.value)  # 移动
        op11.move_times.append(1.0)
        op11.move_types.append(MoveType.PLACE_MOVE.value)  # 放晶圆
        # TODO : 时间是PUT_TIME_TM2
        op11.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op11)

        '''加工工序：PM7/PM8'''
        op2 = Operation()
        op2.id = 2
        op2.machine_names.append("PM7")
        op2.processing_times.append(1.0 + 70.0 + 1.0)  # 开门+加工+关门
        op2.machine_names.append("PM8")
        op2.processing_times.append(1.0 + 70.0 + 1.0)  # 开门+加工+关门
        op2.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
        op2.move_times.append(1.0)
        op2.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工
        op2.move_times.append(70.0)
        op2.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
        op2.move_times.append(1.0)
        job.operations.append(op2)

        '''运输工序：PM7/PM8 to LLC by TM2'''
        op22 = Operation()
        op22.machine_names.append("TM2")
        # TODO:转移时间2秒，怎么计算的？
        op22.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op22.move_types.append(MoveType.PICK_MOVE.value)  # 取晶圆
        op22.move_times.append(Parameter.TAKE_TIME_TM2)
        op22.move_types.append(MoveType.TRANS_MOVE.value)  # 移动
        op22.move_times.append(2.0)
        op22.move_types.append(MoveType.PLACE_MOVE.value)  # 放晶圆
        op22.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op22)

        '''加工工序：LLC'''
        op3 = Operation()
        op3.id = 3
        op3.machine_names.append("LLC")
        op3.processing_times.append(1.0 + 0.0 + 1.0)  # LLC无处理时间
        op3.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
        op3.move_times.append(1.0)
        op3.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
        op3.move_times.append(1.0)
        job.operations.append(op3)

        '''运输工序：LLC to PM1/PM2 by TM3'''
        op33 = Operation()
        op33.machine_names.append("TM3")
        op33.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op33.move_types.append(MoveType.PICK_MOVE.value)  # 取晶圆
        op33.move_times.append(Parameter.TAKE_TIME_TM2)
        # TODO：转移时间2秒怎么计算
        op33.move_types.append(MoveType.TRANS_MOVE.value)  # 移动
        op33.move_times.append(2.0)
        op33.move_types.append(MoveType.PLACE_MOVE.value)  # 放晶圆
        op33.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op33)

        '''加工工序：PM1/PM2'''
        op4 = Operation()
        op4.id = 4  # 修正原代码中的ID冲突（原代码中op4和op2的id均为2）
        op4.machine_names.append("PM1")
        op4.processing_times.append(1.0 + 300.0 + 1.0)  # 开门+加工+关门
        op4.machine_names.append("PM2")
        op4.processing_times.append(1.0 + 300.0 + 1.0)  # 开门+加工+关门
        op4.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
        op4.move_times.append(1.0)
        op4.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工
        op4.move_times.append(300.0)
        op4.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
        op4.move_times.append(1.0)
        job.operations.append(op4)

        '''运输工序：PM1/PM2 to LLD by TM3'''
        op44 = Operation()
        op44.machine_names.append("TM3")
        op44.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op44.move_types.append(MoveType.PICK_MOVE.value)  # 取晶圆
        op44.move_times.append(Parameter.TAKE_TIME_TM2)
        op44.move_types.append(MoveType.TRANS_MOVE.value)  # 移动
        # TODO：转移时间2秒怎么计算
        op44.move_times.append(2.0)
        op44.move_types.append(MoveType.PLACE_MOVE.value)  # 放晶圆
        op44.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op44)

        '''加工工序：LLD'''
        op5 = Operation()
        op5.id = 5
        op5.machine_names.append("LLD")
        op5.processing_times.append(1.0 + 70.0 + 1.0)  # 开门+加工+关门
        op5.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
        op5.move_times.append(1.0)
        op5.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工
        op5.move_times.append(70.0)
        op5.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
        op5.move_times.append(1.0)
        job.operations.append(op5)

        '''运输工序：LLD to LLA/LLB by TM2'''
        op55 = Operation()
        op55.machine_names.append("TM2")
        op55.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op55.move_types.append(MoveType.PICK_MOVE.value)  # 取晶圆
        op55.move_times.append(Parameter.TAKE_TIME_TM2)
        # TODO：转移时间2秒怎么计算
        op55.move_types.append(MoveType.TRANS_MOVE.value)  # 移动
        op55.move_times.append(2.0)
        op55.move_types.append(MoveType.PLACE_MOVE.value)  # 放晶圆
        op55.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op55)

        '''加工工序：LLA/LLB'''
        op6 = Operation()
        # TODO：原代码中op6和op5的id均为5
        op6.id = 6
        op6.machine_names.append("LLA")
        op6.processing_times.append(1.0 + 20.0 + 1.0)  # 开门+充气+关门
        op6.machine_names.append("LLB")
        op6.processing_times.append(1.0 + 20.0 + 1.0)  # 开门+充气+关门
        op6.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
        op6.move_times.append(1.0)
        op6.move_types.append(MoveType.VENT_MOVE.value)  # 充气
        op6.move_times.append(20.0)
        op6.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
        op6.move_times.append(1.0)
        job.operations.append(op6)

        return job

    def generate_job_c(self) -> Job:
        """
        工艺路径为C 的工件：
        LLA/LLB-PM7/PM8[70]-LLC-PM1/PM2/PM3/PM4[600]-LLD-PM9/PM10[200]-LLA/LLB[70]
        """
        job = Job()
        job.id = 1
        job.name = "C"

        '''加工工序：LLA/LLB'''
        op1 = Operation()
        op1.id = 1
        op1.machine_names.append("LLA")
        op1.processing_times.append(1.0 + 15.0 + 1.0)
        op1.machine_names.append("LLB")
        op1.processing_times.append(1.0 + 15.0 + 1.0)
        op1.move_types.append(MoveType.COMPLETE_MOVE.value)
        op1.move_times.append(1.0)
        op1.move_types.append(MoveType.PUMP_MOVE.value)
        op1.move_times.append(15.0)
        op1.move_types.append(MoveType.PREPARE_MOVE.value)
        op1.move_times.append(1.0)
        job.operations.append(op1)

        '''运输工序：LLA/LLB to PM7/PM8 by TM2'''
        op11 = Operation()
        op11.machine_names.append("TM2")
        op11.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)
        op11.move_types.append(MoveType.PICK_MOVE.value)
        op11.move_times.append(Parameter.TAKE_TIME_TM2)
        # TODO：运输时间怎么算的
        op11.move_types.append(MoveType.TRANS_MOVE.value)
        op11.move_times.append(2.0)
        op11.move_types.append(MoveType.PLACE_MOVE.value)
        op11.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op11)

        '''加工工序：PM7/PM8[70]'''
        op2 = Operation()
        op2.id = 2
        op2.machine_names.append("PM7")
        op2.processing_times.append(1.0 + 70.0 + 1.0)
        op2.machine_names.append("PM8")
        op2.processing_times.append(1.0 + 70.0 + 1.0)
        op2.move_types.append(MoveType.COMPLETE_MOVE.value)
        op2.move_times.append(1.0)
        op2.move_types.append(MoveType.PROCESS_MOVE.value)
        op2.move_times.append(70.0)
        op2.move_types.append(MoveType.PREPARE_MOVE.value)
        op2.move_times.append(1.0)
        job.operations.append(op2)

        '''运输工序：PM7/PM8 to LLC by TM2'''
        op22 = Operation()
        op22.machine_names.append("TM2")
        op22.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)
        op22.move_types.append(MoveType.PICK_MOVE.value)
        op22.move_times.append(Parameter.TAKE_TIME_TM2)
        op22.move_types.append(MoveType.TRANS_MOVE.value)
        op22.move_times.append(2.0)
        op22.move_types.append(MoveType.PLACE_MOVE.value)
        op22.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op22)

        '''加工工序：LLC'''
        op3 = Operation()
        op3.id = 3
        op3.machine_names.append("LLC")
        op3.processing_times.append(1.0 + 0.0 + 1.0)
        op3.move_types.append(MoveType.COMPLETE_MOVE.value)
        op3.move_times.append(1.0)
        op3.move_types.append(MoveType.PREPARE_MOVE.value)
        op3.move_times.append(1.0)
        job.operations.append(op3)

        '''运输工序：LLC to PM1/PM2/PM3/PM4 by TM3'''
        op33 = Operation()
        op33.machine_names.append("TM3")
        # TODO：源代码有误，应该为TM3取放晶圆时间
        op33.processing_times.append(Parameter.TAKE_TIME_TM3 + 2.0 + Parameter.PUT_TIME_TM3)
        op33.move_types.append(MoveType.PICK_MOVE.value)
        op33.move_times.append(Parameter.TAKE_TIME_TM3)
        op33.move_types.append(MoveType.TRANS_MOVE.value)
        op33.move_times.append(2.0)
        op33.move_types.append(MoveType.PLACE_MOVE.value)
        op33.move_times.append(Parameter.PUT_TIME_TM3)
        job.operations.append(op33)

        '''加工工序：PM1/PM2/PM3/PM4[600]'''
        op4 = Operation()
        # TODO：原代码中这里id重复
        op4.id = 4
        op4.machine_names.append("PM1")
        op4.processing_times.append(1.0 + 600.0 + 1.0)
        op4.machine_names.append("PM2")
        op4.processing_times.append(1.0 + 600.0 + 1.0)
        op4.machine_names.append("PM3")
        op4.processing_times.append(1.0 + 600.0 + 1.0)
        op4.machine_names.append("PM4")
        op4.processing_times.append(1.0 + 600.0 + 1.0)
        op4.move_types.append(MoveType.COMPLETE_MOVE.value)
        op4.move_times.append(1.0)
        op4.move_types.append(MoveType.PROCESS_MOVE.value)
        op4.move_times.append(600.0)
        op4.move_types.append(MoveType.PREPARE_MOVE.value)
        op4.move_times.append(1.0)
        job.operations.append(op4)

        '''运输工序：PM1/PM2/PM3/PM4 to LLD by TM3'''
        op44 = Operation()
        op44.machine_names.append("TM3")
        # TODO：源代码有误，应该为TM3取放晶圆时间
        op44.processing_times.append(Parameter.TAKE_TIME_TM3 + 2.0 + Parameter.PUT_TIME_TM3)
        op44.move_types.append(MoveType.PICK_MOVE.value)
        op44.move_times.append(Parameter.TAKE_TIME_TM3)
        op44.move_types.append(MoveType.TRANS_MOVE.value)
        op44.move_times.append(2.0)
        op44.move_types.append(MoveType.PLACE_MOVE.value)
        op44.move_times.append(Parameter.PUT_TIME_TM3)
        job.operations.append(op44)

        '''加工工序：LLD'''
        op5 = Operation()
        op5.id = 5
        op5.machine_names.append("LLD")
        op5.processing_times.append(1.0 + 0.0 + 1.0)
        op5.move_types.append(MoveType.COMPLETE_MOVE.value)
        op5.move_times.append(1.0)
        op5.move_types.append(MoveType.PREPARE_MOVE.value)
        op5.move_times.append(1.0)
        job.operations.append(op5)

        '''运输工序：LLD to PM9/PM10 by TM2'''
        op55 = Operation()
        op55.machine_names.append("TM2")
        op55.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)
        op55.move_types.append(MoveType.PICK_MOVE.value)
        op55.move_times.append(Parameter.TAKE_TIME_TM2)
        op55.move_types.append(MoveType.TRANS_MOVE.value)
        op55.move_times.append(2.0)
        op55.move_types.append(MoveType.PLACE_MOVE.value)
        op55.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op55)

        '''加工工序：PM9/PM10[200]'''
        op7 = Operation()
        # TODO：原代码中id有重复，且变量名是op66
        op7.id = 6
        op7.machine_names.append("PM9")
        op7.processing_times.append(1.0 + 200.0 + 1.0)
        op7.machine_names.append("PM10")
        op7.processing_times.append(1.0 + 200.0 + 1.0)
        op7.move_types.append(MoveType.COMPLETE_MOVE.value)
        op7.move_times.append(1.0)
        op7.move_types.append(MoveType.PROCESS_MOVE.value)
        op7.move_times.append(200.0)
        op7.move_types.append(MoveType.PREPARE_MOVE.value)
        op7.move_times.append(1.0)
        job.operations.append(op7)

        '''运输工序：PM9/PM10 to LLA/LLB by TM2'''
        # TODO：源代码为啥没有这个运输工序？
        op66 = Operation()
        op66.machine_names.append("TM2")
        op66.processing_times.append(Parameter.TAKE_TIME_TM2 + 1.0 + Parameter.PUT_TIME_TM2)
        op66.move_types.append(MoveType.PICK_MOVE.value)
        op66.move_times.append(Parameter.TAKE_TIME_TM2)
        op66.move_types.append(MoveType.TRANS_MOVE.value)
        op66.move_times.append(1.0)
        op66.move_types.append(MoveType.PLACE_MOVE.value)
        op66.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op66)

        '''加工工序：LLA/LLB'''
        # TODO：源代码id有问题，且是op6
        op7 = Operation()
        op7.id = 7
        op7.machine_names.append("LLA")
        op7.processing_times.append(1.0 + 20.0 + 1.0)
        op7.machine_names.append("LLB")
        op7.processing_times.append(1.0 + 20.0 + 1.0)
        op7.move_types.append(MoveType.COMPLETE_MOVE.value)
        op7.move_times.append(1.0)
        op7.move_types.append(MoveType.VENT_MOVE.value)
        op7.move_times.append(20.0)
        op7.move_types.append(MoveType.PREPARE_MOVE.value)
        op7.move_times.append(1.0)
        job.operations.append(op7)

        return job

    def generate_job_d(self) -> Job:
        """
        生成工艺路径为"D" 的工件
        LLA/LLB-PM7/PM8[70]-PM9/PM10[200]-LLD[70]-LLA/LLB
        """

        # TODO : 路径D，源代码定义有问题，不是规定路径

        job = Job()
        job.id = 1
        job.name = "D"

        '''加工工序：LLA/LLB'''
        op1 = Operation()
        op1.id = 1
        op1.machine_names.append("LLA")
        op1.processing_times.append(1.0 + 15.0 + 1.0)
        op1.machine_names.append("LLB")
        op1.processing_times.append(1.0 + 15.0 + 1.0)
        op1.move_types.append(MoveType.COMPLETE_MOVE.value)
        op1.move_times.append(1.0)
        op1.move_types.append(MoveType.PUMP_MOVE.value)
        op1.move_times.append(15.0)
        op1.move_types.append(MoveType.PREPARE_MOVE.value)
        op1.move_times.append(1.0)
        job.operations.append(op1)

        '''运输工序：LLA/LLB to PM7/PM8 by TM2'''
        op11 = Operation()
        op11.machine_names.append("TM2")
        op11.processing_times.append(Parameter.TAKE_TIME_TM2 + 1.0 + Parameter.PUT_TIME_TM2)
        op11.move_types.append(MoveType.PICK_MOVE.value)
        op11.move_times.append(Parameter.TAKE_TIME_TM2)
        op11.move_types.append(MoveType.TRANS_MOVE.value)
        op11.move_times.append(1.0)
        op11.move_types.append(MoveType.PLACE_MOVE.value)
        # TODO:源代码是取晶圆时间
        op11.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op11)

        '''加工工序：PM7/PM8'''
        op2 = Operation()
        op2.id = 2
        op2.machine_names.append("PM7")
        op2.processing_times.append(1.0 + 70.0 + 1.0)
        op2.machine_names.append("PM8")
        op2.processing_times.append(1.0 + 70.0 + 1.0)
        op2.move_types.append(MoveType.COMPLETE_MOVE.value)
        op2.move_times.append(1.0)
        op2.move_types.append(MoveType.PROCESS_MOVE.value)
        op2.move_times.append(70.0)
        op2.move_types.append(MoveType.PREPARE_MOVE.value)
        op2.move_times.append(1.0)
        job.operations.append(op2)

        '''运输工序：PM7/PM8 to PM9/PM10 by TM2'''
        op22 = Operation()
        op22.machine_names.append("TM2")
        op22.processing_times.append(Parameter.TAKE_TIME_TM2 + 0.5 + Parameter.PUT_TIME_TM2)
        op22.move_types.append(MoveType.PICK_MOVE.value)
        op22.move_times.append(Parameter.TAKE_TIME_TM2)
        op22.move_types.append(MoveType.TRANS_MOVE.value)
        op22.move_times.append(0.5)
        op22.move_types.append(MoveType.PLACE_MOVE.value)
        op22.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op22)

        '''加工工序：PM9/PM10[200]'''
        op3 = Operation()
        op3.id = 3
        op3.machine_names.append("PM9")
        op3.processing_times.append(1.0 + 200.0 + 1.0)
        op3.machine_names.append("PM10")
        op3.processing_times.append(1.0 + 200.0 + 1.0)
        op3.move_types.append(MoveType.COMPLETE_MOVE.value)
        op3.move_times.append(1.0)
        op3.move_types.append(MoveType.PROCESS_MOVE.value)
        op3.move_times.append(200.0)
        op3.move_types.append(MoveType.PREPARE_MOVE.value)
        op3.move_times.append(1.0)
        job.operations.append(op3)

        '''运输工序：PM9/PM10 to LLD by TM2'''
        op33 = Operation()
        op33.machine_names.append("TM2")
        op33.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)
        op33.move_types.append(MoveType.PICK_MOVE.value)
        op33.move_times.append(Parameter.TAKE_TIME_TM2)
        op33.move_types.append(MoveType.TRANS_MOVE.value)
        op33.move_times.append(2.0)
        op33.move_types.append(MoveType.PLACE_MOVE.value)
        op33.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op33)

        '''加工工序：LLD[70]'''
        op4 = Operation()
        op4.id = 4
        op4.machine_names.append("LLD")
        op4.processing_times.append(1.0 + 70.0 + 1.0)
        op4.move_types.append(MoveType.COMPLETE_MOVE.value)
        op4.move_times.append(1.0)
        op4.move_types.append(MoveType.PROCESS_MOVE.value)
        op4.move_times.append(70.0)
        op4.move_types.append(MoveType.PREPARE_MOVE.value)
        op4.move_times.append(1.0)
        job.operations.append(op4)

        '''运输工序：LLD to LLA/LLB by TM2相关'''
        op44 = Operation()
        op44.machine_names.append("TM2")
        op44.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)
        op44.move_types.append(MoveType.PICK_MOVE.value)
        op44.move_times.append(Parameter.TAKE_TIME_TM2)
        op44.move_types.append(MoveType.TRANS_MOVE.value)
        op44.move_times.append(2.0)
        op44.move_types.append(MoveType.PLACE_MOVE.value)
        op44.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op44)

        '''加工工序：LLA/LLB'''
        op5 = Operation()
        op5.id = 5
        op5.machine_names.append("LLA")
        op5.processing_times.append(1.0 + 20.0 + 1.0)
        op5.machine_names.append("LLB")
        op5.processing_times.append(1.0 + 20.0 + 1.0)
        op5.move_types.append(MoveType.COMPLETE_MOVE.value)
        op5.move_times.append(1.0)
        op5.move_types.append(MoveType.VENT_MOVE.value)
        op5.move_times.append(20.0)
        op5.move_types.append(MoveType.PREPARE_MOVE.value)
        op5.move_times.append(1.0)
        job.operations.append(op5)

        return job

    def generate_job_e(self) -> Job:
        """
        工艺路径为 E 的工件
        LLA/LLB-PM7/PM8[70]-LLC-PM1[600]-LLD[70]-LLA/LLB
        """

        job = Job()
        job.id = 1
        job.name = "E"

        '''加工工序：LLA/LLB'''
        # TODO：为什么源代码不用LLA?
        op1 = Operation()
        op1.id = 1
        op1.machine_names.append("LLA")
        op1.processing_times.append(1.0 + 15.0 + 1.0)
        op1.machine_names.append("LLB")
        op1.processing_times.append(1.0 + 15.0 + 1.0)  # 开门+抽气+关门
        op1.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
        op1.move_times.append(1.0)
        op1.move_types.append(MoveType.PUMP_MOVE.value)  # 抽气
        op1.move_times.append(15.0)
        op1.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
        op1.move_times.append(1.0)
        job.operations.append(op1)

        '''运输工序：LLA/LLB to PM7/PM8 by TM2'''
        op11 = Operation()
        op11.machine_names.append("TM2")
        op11.processing_times.append(Parameter.TAKE_TIME_TM2 + 1.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op11.move_types.append(MoveType.PICK_MOVE.value)  # 取晶圆
        op11.move_times.append(Parameter.TAKE_TIME_TM2)
        op11.move_types.append(MoveType.TRANS_MOVE.value)  # 移动
        op11.move_times.append(1.0)
        op11.move_types.append(MoveType.PLACE_MOVE.value)  # 放晶圆
        op11.move_times.append(Parameter.TAKE_TIME_TM2)
        job.operations.append(op11)

        '''加工工序：PM7/PM8[70]'''
        # TODO：为啥源代码不用PM7?
        op2 = Operation()
        op2.id = 2
        op2.machine_names.append("PM7")
        op2.processing_times.append(1.0 + 70.0 + 1.0)
        op2.machine_names.append("PM8")
        op2.processing_times.append(1.0 + 70.0 + 1.0)  # 开门+加工+关门
        op2.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
        op2.move_times.append(1.0)
        op2.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工
        op2.move_times.append(70.0)
        op2.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
        op2.move_times.append(1.0)
        job.operations.append(op2)

        '''运输工序：PM7/PM8 to LLC by TM2'''
        op22 = Operation()
        op22.machine_names.append("TM2")
        op22.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op22.move_types.append(MoveType.PICK_MOVE.value)  # 取晶圆
        op22.move_times.append(Parameter.TAKE_TIME_TM2)
        op22.move_types.append(MoveType.TRANS_MOVE.value)  # 移动
        op22.move_times.append(2.0)
        op22.move_types.append(MoveType.PLACE_MOVE.value)  # 放晶圆
        op22.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op22)

        '''加工工序：LLC'''
        op3 = Operation()
        op3.id = 3
        op3.machine_names.append("LLC")
        op3.processing_times.append(1.0 + 0.0 + 1.0)  # LLC无处理时间
        op3.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
        op3.move_times.append(1.0)
        op3.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
        op3.move_times.append(1.0)
        job.operations.append(op3)

        '''运输工序：LLC to PM1 by TM3'''
        op33 = Operation()
        op33.machine_names.append("TM3")
        # TODO：应为TM3参数
        op33.processing_times.append(Parameter.TAKE_TIME_TM3 + 2.0 + Parameter.PUT_TIME_TM3)  # 取+运+放
        op33.move_types.append(MoveType.PICK_MOVE.value)  # 取晶圆
        op33.move_times.append(Parameter.TAKE_TIME_TM3)
        op33.move_types.append(MoveType.TRANS_MOVE.value)  # 移动
        op33.move_times.append(2.0)
        op33.move_types.append(MoveType.PLACE_MOVE.value)  # 放晶圆
        op33.move_times.append(Parameter.PUT_TIME_TM3)
        job.operations.append(op33)

        '''加工工序：PM1[600]'''
        op4 = Operation()
        # TODO：原代码中op4和op2的id均为2
        op4.id = 4
        op4.machine_names.append("PM1")
        op4.processing_times.append(1.0 + 600.0 + 1.0)  # 开门+加工+关门
        op4.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
        op4.move_times.append(1.0)
        op4.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工
        op4.move_times.append(600.0)
        op4.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
        op4.move_times.append(1.0)
        job.operations.append(op4)

        '''运输工序：PM1 to LLD by TM3'''
        op44 = Operation()
        op44.machine_names.append("TM3")
        # TODO：TM3相关参数
        op44.processing_times.append(Parameter.TAKE_TIME_TM3 + 2.0 + Parameter.PUT_TIME_TM3)  # 取+运+放
        op44.move_types.append(MoveType.PICK_MOVE.value)  # 取晶圆
        op44.move_times.append(Parameter.TAKE_TIME_TM3)
        op44.move_types.append(MoveType.TRANS_MOVE.value)  # 移动
        op44.move_times.append(2.0)
        op44.move_types.append(MoveType.PLACE_MOVE.value)  # 放晶圆
        op44.move_times.append(Parameter.PUT_TIME_TM3)
        job.operations.append(op44)

        '''加工工序：LLD[70]'''
        op5 = Operation()
        op5.id = 5
        op5.machine_names.append("LLD")
        op5.processing_times.append(1.0 + 70.0 + 1.0)  # 开门+加工+关门
        op5.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
        op5.move_times.append(1.0)
        op5.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工
        op5.move_times.append(70.0)
        op5.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
        op5.move_times.append(1.0)
        job.operations.append(op5)

        '''运输工序：LLD to LLA/LLB by TM2'''
        op55 = Operation()
        op55.machine_names.append("TM2")
        op55.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op55.move_types.append(MoveType.PICK_MOVE.value)  # 取晶圆
        op55.move_times.append(Parameter.TAKE_TIME_TM2)
        op55.move_types.append(MoveType.TRANS_MOVE.value)  # 移动
        op55.move_times.append(2.0)
        op55.move_types.append(MoveType.PLACE_MOVE.value)  # 放晶圆
        op55.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op55)

        '''加工工序：LLA/LLB'''
        op6 = Operation()
        # TODO：源代码id重复
        op6.id = 6
        # TODO：源代码为啥没有LLA?
        op6.machine_names.append("LLA")
        op6.processing_times.append(1.0 + 20.0 + 1.0)
        op6.machine_names.append("LLB")
        op6.processing_times.append(1.0 + 20.0 + 1.0)  # 开门+充气+关门
        op6.move_types.append(MoveType.COMPLETE_MOVE.value)  # 关门
        op6.move_times.append(1.0)
        op6.move_types.append(MoveType.VENT_MOVE.value)  # 充气
        op6.move_times.append(20.0)
        op6.move_types.append(MoveType.PREPARE_MOVE.value)  # 开门
        op6.move_times.append(1.0)
        job.operations.append(op6)

        return job

    def generate_job_f(self) -> Job:
        """
        工艺路径为 F 的工件：
        LLA/LLB - PM7/PM8[70] - LLC - PM2[600] - LLD[70] - LLA/LLB
        """

        job = Job()
        job.id = 1
        job.name = "F"

        '''加工工序：LLA/LLB'''
        op1 = Operation()
        op1.id = 1
        op1.machine_names.append("LLA")
        op1.processing_times.append(1.0 + 15.0 + 1.0)  # 关门 + 抽气 + 开门
        # TODO : 源代码为啥注释掉LLB
        op1.machine_names.append("LLB")
        op1.processing_times.append(1.0 + 15.0 + 1.0)
        op1.move_types.append(MoveType.COMPLETE_MOVE.value)
        op1.move_times.append(1.0)
        op1.move_types.append(MoveType.PUMP_MOVE.value)
        op1.move_times.append(15.0)
        op1.move_types.append(MoveType.PREPARE_MOVE.value)
        op1.move_times.append(1.0)
        job.operations.append(op1)

        '''运输工序：LLA/LLB to PM7/PM8[70] by TM2'''
        op11 = Operation()
        op11.machine_names.append("TM2")
        op11.processing_times.append(Parameter.TAKE_TIME_TM2 + 1.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op11.move_types.append(MoveType.PICK_MOVE.value)
        op11.move_times.append(Parameter.TAKE_TIME_TM2)
        op11.move_types.append(MoveType.TRANS_MOVE.value)
        # TODO : 1秒运输时间
        op11.move_times.append(1.0)
        op11.move_types.append(MoveType.PLACE_MOVE.value)  #
        op11.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op11)

        '''加工工序：PM7/PM8[70]'''
        op2 = Operation()
        op2.id = 2
        op2.machine_names.append("PM7")
        op2.processing_times.append(1.0 + 70.0 + 1.0)  # 准备+加工+完成
        # TODO：原代码中PM8选项被注释
        op2.machine_names.append("PM8")
        op2.processing_times.append(1.0 + 70.0 + 1.0)
        op2.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op2.move_times.append(1.0)
        op2.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工移动
        op2.move_times.append(70.0)
        op2.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op2.move_times.append(1.0)
        job.operations.append(op2)

        '''运输工序：PM7/PM8[70] to LLC by TM2'''
        op22 = Operation()
        op22.machine_names.append("TM2")
        op22.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op22.move_types.append(MoveType.PICK_MOVE.value)
        op22.move_times.append(Parameter.TAKE_TIME_TM2)
        op22.move_types.append(MoveType.TRANS_MOVE.value)
        op22.move_times.append(2.0)
        op22.move_types.append(MoveType.PLACE_MOVE.value)
        op22.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op22)

        '''加工工序：LLC'''
        op3 = Operation()
        op3.id = 3
        op3.machine_names.append("LLC")
        op3.processing_times.append(1.0 + 0.0 + 1.0)  # 准备+无处理+完成（LLC无加工时间）
        op3.move_types.append(MoveType.COMPLETE_MOVE.value)
        op3.move_times.append(1.0)
        op3.move_types.append(MoveType.PREPARE_MOVE.value)
        op3.move_times.append(1.0)
        job.operations.append(op3)

        '''运输工序：LLC to PM2 by TM3'''
        op33 = Operation()
        op33.machine_names.append("TM3")
        # TODO：源代码用 TM2 参数
        op33.processing_times.append(Parameter.TAKE_TIME_TM3 + 2.0 + Parameter.PUT_TIME_TM3)  # 取+运+放
        op33.move_types.append(MoveType.PICK_MOVE.value)
        op33.move_times.append(Parameter.TAKE_TIME_TM3)
        op33.move_types.append(MoveType.TRANS_MOVE.value)
        op33.move_times.append(2.0)
        op33.move_types.append(MoveType.PLACE_MOVE.value)
        op33.move_times.append(Parameter.PUT_TIME_TM3)
        job.operations.append(op33)

        '''加工工序： PM2[600]'''
        op4 = Operation()
        # TODO ： 编号 4  or 2 ?
        op4.id = 4
        op4.machine_names.append("PM2")
        op4.processing_times.append(1.0 + 600.0 + 1.0)  # 关门 + 加工 + 开门
        op4.move_types.append(MoveType.COMPLETE_MOVE.value)
        op4.move_times.append(1.0)
        op4.move_types.append(MoveType.PROCESS_MOVE.value)
        op4.move_times.append(600.0)
        op4.move_types.append(MoveType.PREPARE_MOVE.value)
        op4.move_times.append(1.0)
        job.operations.append(op4)

        '''运输工序：PM2 to LLD[70] by TM3'''
        op44 = Operation()
        op44.machine_names.append("TM3")
        # TODO : TM3 参数
        op44.processing_times.append(Parameter.TAKE_TIME_TM3 + 2.0 + Parameter.PUT_TIME_TM3)  # 取+运+放
        op44.move_types.append(MoveType.PICK_MOVE.value)
        op44.move_times.append(Parameter.TAKE_TIME_TM3)
        op44.move_types.append(MoveType.TRANS_MOVE.value)
        op44.move_times.append(2.0)
        op44.move_types.append(MoveType.PLACE_MOVE.value)
        op44.move_times.append(Parameter.PUT_TIME_TM3)
        job.operations.append(op44)

        '''加工工序：LLD[70]'''
        op5 = Operation()
        op5.id = 5
        op5.machine_names.append("LLD")
        op5.processing_times.append(1.0 + 70.0 + 1.0)  # 准备+加工+完成
        op5.move_types.append(MoveType.COMPLETE_MOVE.value)
        op5.move_times.append(1.0)
        op5.move_types.append(MoveType.PROCESS_MOVE.value)
        op5.move_times.append(70.0)
        op5.move_types.append(MoveType.PREPARE_MOVE.value)
        op5.move_times.append(1.0)
        job.operations.append(op5)

        '''运输工序：LLD[70] to LLA/LLB by TM2'''
        op55 = Operation()
        op55.machine_names.append("TM2")
        op55.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op55.move_types.append(MoveType.PICK_MOVE.value)
        op55.move_times.append(Parameter.TAKE_TIME_TM2)
        op55.move_types.append(MoveType.TRANS_MOVE.value)
        op55.move_times.append(2.0)
        op55.move_types.append(MoveType.PLACE_MOVE.value)
        op55.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op55)

        '''加工工序：LLA/LLB'''
        op6 = Operation()
        # TODO ： 编号
        op6.id = 6
        op6.machine_names.append("LLA")
        op6.processing_times.append(1.0 + 20.0 + 1.0)  # 准备+排气+完成
        # TODO：原代码中LLB选项被注释
        op6.machine_names.append("LLB")
        op6.processing_times.append(1.0 + 20.0 + 1.0)
        op6.move_types.append(MoveType.COMPLETE_MOVE.value)
        op6.move_times.append(1.0)
        op6.move_types.append(MoveType.VENT_MOVE.value)
        op6.move_times.append(20.0)
        op6.move_types.append(MoveType.PREPARE_MOVE.value)
        op6.move_times.append(1.0)
        job.operations.append(op6)

        return job

    def generate_job_g(self) -> Job:
        """
        工艺路径为 G 的工件
        LLA/LLB - PM7/PM8[70] - LLC - PM3[600] - LLD[70] - LLA/LLB
        """

        job = Job()
        job.id = 1
        job.name = "G"

        '''加工工序：LLA/LLB'''
        op1 = Operation()
        op1.id = 1
        op1.machine_names.append("LLA")
        op1.processing_times.append(1.0 + 15.0 + 1.0)  # 准备+抽气+完成
        # TODO : 为啥注释掉LLB
        op1.machine_names.append("LLB")
        op1.processing_times.append(1.0 + 15.0 + 1.0)
        op1.move_types.append(MoveType.COMPLETE_MOVE.value)
        op1.move_times.append(1.0)
        op1.move_types.append(MoveType.PUMP_MOVE.value)
        op1.move_times.append(15.0)
        op1.move_types.append(MoveType.PREPARE_MOVE.value)
        op1.move_times.append(1.0)
        job.operations.append(op1)

        '''运输工序：LLA/LLB to PM7/PM8[70] by TM2'''
        op11 = Operation()
        op11.machine_names.append("TM2")
        op11.processing_times.append(Parameter.TAKE_TIME_TM2 + 1.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op11.move_types.append(MoveType.PICK_MOVE.value)
        op11.move_times.append(Parameter.TAKE_TIME_TM2)
        op11.move_types.append(MoveType.TRANS_MOVE.value)
        op11.move_times.append(1.0)
        op11.move_types.append(MoveType.PLACE_MOVE.value)
        op11.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op11)

        '''加工工序：PM7/PM8[70]'''
        op2 = Operation()
        op2.id = 2
        op2.machine_names.append("PM7")
        op2.processing_times.append(1.0 + 70.0 + 1.0)  # 准备+加工+完成
        # TODO：原代码中PM8选项被注释
        op2.machine_names.append("PM8")
        op2.processing_times.append(1.0 + 70.0 + 1.0)
        op2.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op2.move_times.append(1.0)
        op2.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工移动
        op2.move_times.append(70.0)
        op2.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op2.move_times.append(1.0)
        job.operations.append(op2)

        '''运输工序：PM7/PM8[70] to LLC by TM2'''
        op22 = Operation()
        op22.machine_names.append("TM2")
        op22.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op22.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op22.move_times.append(Parameter.TAKE_TIME_TM2)
        op22.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op22.move_times.append(2.0)
        op22.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op22.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op22)

        '''加工工序：LLC'''
        op3 = Operation()
        op3.id = 3
        op3.machine_names.append("LLC")
        op3.processing_times.append(1.0 + 0.0 + 1.0)
        op3.move_types.append(MoveType.COMPLETE_MOVE.value)
        op3.move_times.append(1.0)
        op3.move_types.append(MoveType.PREPARE_MOVE.value)
        op3.move_times.append(1.0)
        job.operations.append(op3)

        '''运输工序：LLC to PM3[600] by TM3'''
        op33 = Operation()
        op33.machine_names.append("TM3")
        # TODO:原代码中使用了TM2的参数
        op33.processing_times.append(Parameter.TAKE_TIME_TM3 + 2.0 + Parameter.PUT_TIME_TM3)  # 取+运+放
        op33.move_types.append(MoveType.PICK_MOVE.value)
        op33.move_times.append(Parameter.TAKE_TIME_TM3)
        op33.move_types.append(MoveType.TRANS_MOVE.value)
        op33.move_times.append(2.0)
        op33.move_types.append(MoveType.PLACE_MOVE.value)
        op33.move_times.append(Parameter.PUT_TIME_TM3)
        job.operations.append(op33)

        '''加工工序：PM3[600]'''
        op4 = Operation()
        # TODO : 原代码中id为2
        op4.id = 4
        op4.machine_names.append("PM3")
        op4.processing_times.append(1.0 + 600.0 + 1.0)  # 准备+加工+完成
        op4.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op4.move_times.append(1.0)
        op4.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工移动
        op4.move_times.append(600.0)
        op4.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op4.move_times.append(1.0)
        job.operations.append(op4)

        '''运输工序：PM3[600] to LLD[70] by TM3'''
        op44 = Operation()
        op44.machine_names.append("TM3")
        #TODO：原代码中使用了TM2的参数
        op44.processing_times.append(Parameter.TAKE_TIME_TM3 + 2.0 + Parameter.PUT_TIME_TM3)  # 取+运+放
        op44.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op44.move_times.append(Parameter.TAKE_TIME_TM3)
        op44.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op44.move_times.append(2.0)
        op44.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op44.move_times.append(Parameter.PUT_TIME_TM3)
        job.operations.append(op44)

        '''加工工序：LLD[70]'''
        op5 = Operation()
        op5.id = 5
        op5.machine_names.append("LLD")
        op5.processing_times.append(1.0 + 70.0 + 1.0)
        op5.move_types.append(MoveType.COMPLETE_MOVE.value)
        op5.move_times.append(1.0)
        op5.move_types.append(MoveType.PROCESS_MOVE.value)
        op5.move_times.append(70.0)
        op5.move_types.append(MoveType.PREPARE_MOVE.value)
        op5.move_times.append(1.0)
        job.operations.append(op5)

        '''运输工序：LLD to LLA/LLB by TM2'''
        op55 = Operation()
        op55.machine_names.append("TM2")
        op55.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op55.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op55.move_times.append(Parameter.TAKE_TIME_TM2)
        op55.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op55.move_times.append(2.0)
        op55.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op55.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op55)

        '''加工工序：LLA/LLB'''
        op6 = Operation()
        # TODO : id重复
        op6.id = 6
        op6.machine_names.append("LLA")
        op6.processing_times.append(1.0 + 20.0 + 1.0)  # 准备+排气+完成
        # TODO：原代码中LLB选项被注释
        op6.machine_names.append("LLB")
        op6.processing_times.append(1.0 + 20.0 + 1.0)
        op6.move_types.append(MoveType.COMPLETE_MOVE.value)
        op6.move_times.append(1.0)
        op6.move_types.append(MoveType.VENT_MOVE.value)
        op6.move_times.append(20.0)
        op6.move_types.append(MoveType.PREPARE_MOVE.value)
        op6.move_times.append(1.0)
        job.operations.append(op6)

        return job

    def generate_job_h(self) -> Job:
        """
        工艺路径为 H 的工件
        LLA/LLB - PM7/PM8[70] - LLC - PM4[600] - LLD[70] - LLA/LLB
        """

        job = Job()
        job.id = 1
        job.name = "H"

        '''加工工序：LLA/LLB'''
        op1 = Operation()
        op1.id = 1
        # TODO：原代码中LLA选项被注释
        op1.machine_names.append("LLA")
        op1.processing_times.append(1.0 + 15.0 + 1.0)
        op1.machine_names.append("LLB")
        op1.processing_times.append(1.0 + 15.0 + 1.0)  # 准备+抽气+完成
        op1.move_types.append(MoveType.COMPLETE_MOVE.value)
        op1.move_times.append(1.0)
        op1.move_types.append(MoveType.PUMP_MOVE.value)
        op1.move_times.append(15.0)
        op1.move_types.append(MoveType.PREPARE_MOVE.value)
        op1.move_times.append(1.0)
        job.operations.append(op1)

        '''运输工序：LLA/LLB to PM7/PM8[70] by TM2'''
        op11 = Operation()
        op11.machine_names.append("TM2")
        op11.processing_times.append(Parameter.TAKE_TIME_TM2 + 1.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op11.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op11.move_times.append(Parameter.TAKE_TIME_TM2)
        op11.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op11.move_times.append(1.0)
        op11.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op11.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op11)

        '''加工工序：PM7/PM8[70]'''
        op2 = Operation()
        op2.id = 2
        # TODO：原代码中PM7选项被注释
        op2.machine_names.append("PM7")
        op2.processing_times.append(1.0 + 70.0 + 1.0)
        op2.machine_names.append("PM8")
        op2.processing_times.append(1.0 + 70.0 + 1.0)  # 准备+加工+完成
        op2.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op2.move_times.append(1.0)
        op2.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工移动
        op2.move_times.append(70.0)
        op2.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op2.move_times.append(1.0)
        job.operations.append(op2)

        '''运输工序：PM7/PM8[70] to LLC by TM2'''
        op22 = Operation()
        op22.machine_names.append("TM2")
        op22.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op22.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op22.move_times.append(Parameter.TAKE_TIME_TM2)
        op22.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op22.move_times.append(2.0)
        op22.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op22.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op22)

        '''加工工序：LLC'''
        op3 = Operation()
        op3.id = 3
        op3.machine_names.append("LLC")
        op3.processing_times.append(1.0 + 0.0 + 1.0)  # 准备+无处理+完成（LLC无加工时间）
        op3.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op3.move_times.append(1.0)
        op3.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op3.move_times.append(1.0)
        job.operations.append(op3)

        '''运输工序：LLC to PM4[600] by TM3'''
        op33 = Operation()
        op33.machine_names.append("TM3")
        # TODO : TM3 参数
        op33.processing_times.append(Parameter.TAKE_TIME_TM3 + 2.0 + Parameter.PUT_TIME_TM3)  # 取+运+放
        op33.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op33.move_times.append(Parameter.TAKE_TIME_TM3)
        op33.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op33.move_times.append(2.0)
        op33.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op33.move_times.append(Parameter.PUT_TIME_TM3)
        job.operations.append(op33)

        '''加工工序：PM4[600]'''
        op4 = Operation()
        op4.id = 4  # TODO ： 编码
        op4.machine_names.append("PM4")
        op4.processing_times.append(1.0 + 600.0 + 1.0)  # 准备+加工+完成
        op4.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op4.move_times.append(1.0)
        op4.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工移动
        op4.move_times.append(600.0)
        op4.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op4.move_times.append(1.0)
        job.operations.append(op4)

        '''运输工序：PM4[600] to LLD[70] by TM3'''
        op44 = Operation()
        op44.machine_names.append("TM3")
        # TODO TM3
        op44.processing_times.append(Parameter.TAKE_TIME_TM3 + 2.0 + Parameter.PUT_TIME_TM3)  # 取+运+放
        op44.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op44.move_times.append(Parameter.TAKE_TIME_TM3)
        op44.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op44.move_times.append(2.0)
        op44.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op44.move_times.append(Parameter.PUT_TIME_TM3)
        job.operations.append(op44)

        '''加工工序：LLD[70]'''
        op5 = Operation()
        op5.id = 5
        op5.machine_names.append("LLD")
        op5.processing_times.append(1.0 + 70.0 + 1.0)  # 准备+加工+完成
        op5.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op5.move_times.append(1.0)
        op5.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工移动
        op5.move_times.append(70.0)
        op5.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op5.move_times.append(1.0)
        job.operations.append(op5)

        '''运输工序：LLD to LLA/LLB by TM2'''
        op55 = Operation()
        op55.machine_names.append("TM2")
        op55.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op55.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op55.move_times.append(Parameter.TAKE_TIME_TM2)
        op55.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op55.move_times.append(2.0)
        op55.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op55.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op55)

        '''加工工序：LLA/LLB'''
        op6 = Operation()
        # TODO : 编号
        op6.id = 6
        # TODO：原代码中LLA选项被注释
        op6.machine_names.append("LLA")
        op6.processing_times.append(1.0 + 20.0 + 1.0)
        op6.machine_names.append("LLB")
        op6.processing_times.append(1.0 + 20.0 + 1.0)  # 准备+排气+完成
        op6.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op6.move_times.append(1.0)
        op6.move_types.append(MoveType.VENT_MOVE.value)  # 排气移动
        op6.move_times.append(20.0)
        op6.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op6.move_times.append(1.0)
        job.operations.append(op6)

        return job

    def generate_job_i(self) -> Job:
        """
        工艺路径为 I 的工件
        LLA/LLB-PM7/PM8[70]-PM9[200]-LLD[70]-LLA/LLB
        """

        job = Job()
        job.id = 1
        job.name = "I"

        '''加工工序：LLA'''
        op1 = Operation()
        op1.id = 1
        op1.machine_names.append("LLA")
        op1.processing_times.append(1.0 + 15.0 + 1.0)  # 准备+抽气+完成
        # TODO：原代码中LLB选项被注释
        op1.machine_names.append("LLB")
        op1.processing_times.append(1.0 + 15.0 + 1.0)
        op1.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op1.move_times.append(1.0)
        op1.move_types.append(MoveType.PUMP_MOVE.value)  # 抽气移动
        op1.move_times.append(15.0)
        op1.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op1.move_times.append(1.0)
        job.operations.append(op1)

        '''运输工序：LLA to PM7/PM8[70] by TM2'''
        op11 = Operation()
        op11.machine_names.append("TM2")
        op11.processing_times.append(Parameter.TAKE_TIME_TM2 + 1.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op11.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op11.move_times.append(Parameter.TAKE_TIME_TM2)
        op11.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op11.move_times.append(1.0)
        op11.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op11.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op11)

        '''加工工序：PM7/PM8[70]'''
        op2 = Operation()
        op2.id = 2
        op2.machine_names.append("PM7")
        op2.processing_times.append(1.0 + 70.0 + 1.0)  # 准备+加工+完成
        # TODO：原代码中PM8选项被注释
        op2.machine_names.append("PM8")
        op2.processing_times.append(1.0 + 70.0 + 1.0)
        op2.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op2.move_times.append(1.0)
        op2.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工移动
        op2.move_times.append(70.0)
        op2.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op2.move_times.append(1.0)
        job.operations.append(op2)

        '''运输工序：PM7/PM8[70] to PM9[200] by TM2'''
        op22 = Operation()
        op22.machine_names.append("TM2")
        op22.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op22.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op22.move_times.append(Parameter.TAKE_TIME_TM2)
        op22.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op22.move_times.append(2.0)
        op22.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op22.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op22)

        '''加工工序：PM9[200]'''
        # TODO : 路径问题，没有LLC
        op3 = Operation()
        op3.id = 3
        op3.machine_names.append("PM9")
        op3.processing_times.append(1.0 + 200.0 + 1.0)  # 准备+无处理+完成（LLC无加工时间）
        op3.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op3.move_times.append(1.0)
        op3.move_types.append(MoveType.PROCESS_MOVE.value)
        op3.move_times.append(200.0)
        op3.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op3.move_times.append(1.0)
        job.operations.append(op3)

        '''运输工序：PM9[200] to LLD[70] by TM2'''
        op33 = Operation()
        op33.machine_names.append("TM2")
        op33.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op33.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op33.move_times.append(Parameter.TAKE_TIME_TM2)
        op33.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op33.move_times.append(2.0)
        op33.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op33.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op33)


        '''加工工序：LLD[70]'''
        op4 = Operation()
        op4.id = 4
        op4.machine_names.append("LLD")
        op4.processing_times.append(1.0 + 70.0 + 1.0)  # 准备+加工+完成
        op4.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op4.move_times.append(1.0)
        op4.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工移动
        op4.move_times.append(70.0)
        op4.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op4.move_times.append(1.0)
        job.operations.append(op4)

        '''运输工序：LLD to LLA/LLB by TM2'''
        op44 = Operation()
        op44.machine_names.append("TM2")
        op44.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op44.move_types.append(MoveType.PICK_MOVE.value)
        op44.move_times.append(Parameter.TAKE_TIME_TM2)
        op44.move_types.append(MoveType.TRANS_MOVE.value)
        op44.move_times.append(2.0)
        op44.move_types.append(MoveType.PLACE_MOVE.value)
        op44.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op44)

        '''加工工序：LLA/LLB'''
        op5 = Operation()
        op5.id = 5  # 原代码中id为5，这里修正为6避免重复
        op5.machine_names.append("LLA")
        op5.processing_times.append(1.0 + 20.0 + 1.0)  # 准备+排气+完成
        # TODO : 原代码中LLB选项被注释
        op5.machine_names.append("LLB")
        op5.processing_times.append(1.0 + 20.0 + 1.0)
        op5.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op5.move_times.append(1.0)
        op5.move_types.append(MoveType.VENT_MOVE.value)  # 排气移动
        op5.move_times.append(20.0)
        op5.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op5.move_times.append(1.0)
        job.operations.append(op5)

        return job

    def generate_job_j(self) -> Job:
        """
        工艺路径为 J 的工件
        LLA/LLB-PM7/PM8[70]-PM10[200]-LLD[70]-LLA/LLB
        """

        job = Job()
        job.id = 1
        # TODO : 名称错误
        job.name = "J"

        '''加工工序：LLA/LLB'''
        op1 = Operation()
        op1.id = 1
        # TODO：原代码中LLA选项被注释
        op1.machine_names.append("LLA")
        op1.processing_times.append(1.0 + 15.0 + 1.0)
        op1.machine_names.append("LLB")
        op1.processing_times.append(1.0 + 15.0 + 1.0)  # 准备+抽气+完成
        op1.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op1.move_times.append(1.0)
        op1.move_types.append(MoveType.PUMP_MOVE.value)  # 抽气移动
        op1.move_times.append(15.0)
        op1.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op1.move_times.append(1.0)
        job.operations.append(op1)

        '''运输工序：LLA/LLB to PM7/PM8[70] by TM2'''
        op11 = Operation()
        op11.machine_names.append("TM2")
        op11.processing_times.append(Parameter.TAKE_TIME_TM2 + 1.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op11.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op11.move_times.append(Parameter.TAKE_TIME_TM2)
        op11.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op11.move_times.append(1.0)
        op11.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op11.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op11)

        '''加工工序：PM7/PM8[70]'''
        op2 = Operation()
        op2.id = 2
        # TODO：原代码中PM7选项被注释
        op2.machine_names.append("PM7")
        op2.processing_times.append(1.0 + 70.0 + 1.0)
        op2.machine_names.append("PM8")
        op2.processing_times.append(1.0 + 70.0 + 1.0)  # 准备+加工+完成
        op2.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op2.move_times.append(1.0)
        op2.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工移动
        op2.move_times.append(70.0)
        op2.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op2.move_times.append(1.0)
        job.operations.append(op2)

        '''运输工序：PM7/PM8[70] to PM10[200] by TM2'''
        op22 = Operation()
        op22.machine_names.append("TM2")
        op22.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op22.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op22.move_times.append(Parameter.TAKE_TIME_TM2)
        op22.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op22.move_times.append(2.0)
        op22.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op22.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op22)

        '''加工工序：PM10[200]'''
        # TODO : 没有LLC
        op3 = Operation()
        op3.id = 3
        op3.machine_names.append("PM10")
        op3.processing_times.append(1.0 + 200.0 + 1.0)  # 准备+无处理+完成（LLC无加工时间）
        op3.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op3.move_times.append(1.0)
        op3.move_types.append(MoveType.PROCESS_MOVE.value)
        op3.move_times.append(200.0)
        op3.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op3.move_times.append(1.0)
        job.operations.append(op3)

        '''运输工序：PM10[200] to LLD[70] by TM2'''
        op33 = Operation()
        op33.machine_names.append("TM2")
        op33.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op33.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op33.move_times.append(Parameter.TAKE_TIME_TM2)
        op33.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op33.move_times.append(2.0)
        op33.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op33.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op33)

        '''加工工序：LLD[70]'''
        op4 = Operation()
        op4.id = 4
        op4.machine_names.append("LLD")
        op4.processing_times.append(1.0 + 70.0 + 1.0)  # 准备+加工+完成
        op4.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op4.move_times.append(1.0)
        op4.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工移动
        op4.move_times.append(70.0)
        op4.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op4.move_times.append(1.0)
        job.operations.append(op4)

        '''运输工序：LLD[70] to LLA/LLB by TM2'''
        op44 = Operation()
        op44.machine_names.append("TM2")
        op44.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op44.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op44.move_times.append(Parameter.TAKE_TIME_TM2)
        op44.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op44.move_times.append(2.0)
        op44.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op44.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op44)

        '''加工工序：LLA/LLB'''
        op5 = Operation()
        op5.id = 6  # 原代码中id为5，这里修正为6避免重复
        # TODO：原代码中LLA选项被注释
        op5.machine_names.append("LLA")
        op5.processing_times.append(1.0 + 20.0 + 1.0)
        op5.machine_names.append("LLB")
        op5.processing_times.append(1.0 + 20.0 + 1.0)  # 准备+排气+完成
        op5.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op5.move_times.append(1.0)
        op5.move_types.append(MoveType.VENT_MOVE.value)  # 排气移动
        op5.move_times.append(20.0)
        op5.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op5.move_times.append(1.0)
        job.operations.append(op5)

        return job

    def generate_job_k(self) -> Job:
        """
        工艺路径为 K 的工件
        LLA/LLB-PM7/PM8[70]-LLC-PM1/PM2/PM3/PM4[600]-LLD-PM9/PM10[200]-LLA/LLB[70]
        """

        job = Job()
        job.id = 1
        job.name = "K"

        '''加工工序：LLA/LLB'''
        op1 = Operation()
        op1.id = 1
        op1.machine_names.append("LLA")
        op1.processing_times.append(1.0 + 15.0 + 1.0)  # 准备+抽气+完成
        op1.machine_names.append("LLB")
        op1.processing_times.append(1.0 + 15.0 + 1.0)  # 相同处理时间
        op1.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op1.move_times.append(1.0)
        op1.move_types.append(MoveType.PUMP_MOVE.value)  # 抽气移动
        op1.move_times.append(15.0)
        op1.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op1.move_times.append(1.0)
        job.operations.append(op1)

        '''运输工序：LLA/LLB to PM7/PM8[70] by TM2'''
        op11 = Operation()
        op11.machine_names.append("TM2")
        op11.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op11.move_types.append(MoveType.PICK_MOVE.value)
        op11.move_times.append(Parameter.TAKE_TIME_TM2)
        op11.move_types.append(MoveType.TRANS_MOVE.value)
        op11.move_times.append(2.0)
        op11.move_types.append(MoveType.PLACE_MOVE.value)
        op11.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op11)

        ''' 加工工序：PM7/PM8[70] '''
        op2 = Operation()
        op2.id = 2
        op2.machine_names.append("PM7")
        op2.processing_times.append(1.0 + 70.0 + 1.0)  # 准备+加工+完成
        op2.machine_names.append("PM8")
        op2.processing_times.append(1.0 + 70.0 + 1.0)  # 相同处理时间
        op2.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op2.move_times.append(1.0)
        op2.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工移动
        op2.move_times.append(70.0)
        op2.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op2.move_times.append(1.0)
        job.operations.append(op2)

        '''运输工序：PM7/PM8[70] to LLC by TM2'''
        op22 = Operation()
        op22.machine_names.append("TM2")
        op22.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op22.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op22.move_times.append(Parameter.TAKE_TIME_TM2)
        op22.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op22.move_times.append(2.0)
        op22.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op22.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op22)

        '''加工工序：LLC'''
        op3 = Operation()
        op3.id = 3
        op3.machine_names.append("LLC")
        op3.processing_times.append(1.0 + 0.0 + 1.0)
        op3.move_types.append(MoveType.COMPLETE_MOVE.value)
        op3.move_times.append(1.0)
        op3.move_types.append(MoveType.PREPARE_MOVE.value)
        op3.move_times.append(1.0)
        job.operations.append(op3)

        '''运输工序：LLC to PM1/PM2/PM3/PM4[600] by TM3'''
        op33 = Operation()
        op33.machine_names.append("TM3")
        # TODO : TM3 参数
        op33.processing_times.append(Parameter.TAKE_TIME_TM3 + 2.0 + Parameter.PUT_TIME_TM3)  # 取+运+放
        op33.move_types.append(MoveType.PICK_MOVE.value)
        op33.move_times.append(Parameter.TAKE_TIME_TM3)
        op33.move_types.append(MoveType.TRANS_MOVE.value)
        op33.move_times.append(2.0)
        op33.move_types.append(MoveType.PLACE_MOVE.value)
        op33.move_times.append(Parameter.PUT_TIME_TM3)
        job.operations.append(op33)

        '''加工工序：PM1/PM2/PM3/PM4[600]'''
        op4 = Operation()
        # TODO : id编号
        op4.id = 4
        op4.machine_names.append("PM1")
        op4.processing_times.append(1.0 + 600.0 + 1.0)  # 准备+加工+完成
        op4.machine_names.append("PM2")
        op4.processing_times.append(1.0 + 600.0 + 1.0)  # 相同处理时间
        op4.machine_names.append("PM3")
        op4.processing_times.append(1.0 + 600.0 + 1.0)  # 相同处理时间
        op4.machine_names.append("PM4")
        op4.processing_times.append(1.0 + 600.0 + 1.0)  # 相同处理时间
        op4.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op4.move_times.append(1.0)
        op4.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工移动
        op4.move_times.append(600.0)
        op4.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op4.move_times.append(1.0)
        job.operations.append(op4)

        '''运输工序：PM1/PM2/PM3/PM4[600] to LLD by TM3'''
        op44 = Operation()
        op44.machine_names.append("TM3")
        # TODO : TM3参数
        op44.processing_times.append(Parameter.TAKE_TIME_TM3 + 2.0 + Parameter.PUT_TIME_TM3)  # 取+运+放
        op44.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op44.move_times.append(Parameter.TAKE_TIME_TM3)
        op44.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op44.move_times.append(2.0)
        op44.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op44.move_times.append(Parameter.PUT_TIME_TM3)
        job.operations.append(op44)

        '''加工工序：LLD'''
        op5 = Operation()
        op5.id = 5
        op5.machine_names.append("LLD")
        op5.processing_times.append(1.0 + 0.0 + 1.0)  # 准备+无处理+完成
        op5.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op5.move_times.append(1.0)
        op5.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op5.move_times.append(1.0)
        job.operations.append(op5)

        '''运输工序：LLD to PM9/PM10[200] by TM2'''
        op55 = Operation()
        op55.machine_names.append("TM2")
        op55.processing_times.append(Parameter.TAKE_TIME_TM2 + 2.0 + Parameter.PUT_TIME_TM2)  # 取+运+放
        op55.move_types.append(MoveType.PICK_MOVE.value)  # 拾取移动
        op55.move_times.append(Parameter.TAKE_TIME_TM2)
        op55.move_types.append(MoveType.TRANS_MOVE.value)  # 运输移动
        op55.move_times.append(2.0)
        op55.move_types.append(MoveType.PLACE_MOVE.value)  # 放置移动
        op55.move_times.append(Parameter.PUT_TIME_TM2)
        job.operations.append(op55)

        '''加工工序：PM9/PM10[200] '''
        # TODO : 加工工序编号应该是op6  源代码是op66
        op6 = Operation()
        # TODO : 编号
        op6.id = 6
        op6.machine_names.append("PM9")
        op6.processing_times.append(1.0 + 200.0 + 1.0)  # 准备+加工+完成
        op6.machine_names.append("PM10")
        op6.processing_times.append(1.0 + 200.0 + 1.0)  # 相同处理时间
        op6.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op6.move_times.append(1.0)
        op6.move_types.append(MoveType.PROCESS_MOVE.value)  # 加工移动
        op6.move_times.append(200.0)
        op6.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op6.move_times.append(1.0)
        job.operations.append(op6)

        '''运输工序 ：PM9/PM10[200] to LLA/LLB[70] by TM2'''
        job.operations.append(op55)  # 再次添加TM2运输工序

        '''加工工序：LLA/LLB[70] '''
        op7 = Operation()
        # TODO 编号7, op7
        op7.id = 7
        op7.machine_names.append("LLA")
        # TODO : 这一步还有70秒加工时间？？？
        op7.processing_times.append(1.0 + 20.0 + 1.0)  # 准备+排气+完成
        op7.machine_names.append("LLB")
        op7.processing_times.append(1.0 + 20.0 + 1.0)  # 相同处理时间
        op7.move_types.append(MoveType.COMPLETE_MOVE.value)  # 完成移动
        op7.move_times.append(1.0)
        op7.move_types.append(MoveType.VENT_MOVE.value)  # 排气移动
        op7.move_times.append(20.0)
        op7.move_types.append(MoveType.PREPARE_MOVE.value)  # 准备移动
        op7.move_times.append(1.0)
        job.operations.append(op7)

        return job


    def generate_machines(self, task_machines: set) -> list[Machine]:
        """
        根据任务所需的机器名称集合，生成对应的机器列表
        """

        machines: List[Machine] = []
        for machine_name in task_machines:
            machine = Machine()
            machine.set_name(machine_name)
            machines.append(machine)
        return machines

    def generate_task_5b(self) -> Task:
        """
        生成Task5b任务：晶圆盒内晶圆全为 B工艺路径工件
        """

        # 为晶圆盒添加B型晶圆
        for i in range(self.wafer_cassette_num):
            self.task.waferCassettes[i].waferTypes.append("B")      # 晶圆盒内晶圆种类列表
            for j in range(self.wafer_cassette_size):
                self.task.waferCassettes[i].waferNames.append("B")  # 晶圆盒内每片晶圆名称列表

        # 生成B型工件并获取所需机器
        job_b = self.generate_job_b()
        task_machines = set()
        # B型工件的工序
        for op in job_b.operations:
            # 每道工序的可用机器
            for machine_name in op.machine_names:
                task_machines.add(machine_name)

        # 为晶圆盒添加分组信息
        for i in range(3):
            # 晶圆（物料）编号：1.1
            wafer_idx = [f"{i + 1}.{j + 1}" for j in range(25)]
            self.task.waferCassettes[i].wafersGroup.append(("B", wafer_idx))

        # 生成任务所需的机器
        self.task.machines = self.generate_machines(task_machines)

        return self.task

if __name__ == '__main__':
    # 测试
    dataGenerator = DataGenerator()
    job = dataGenerator.generate_job_b();
    # 打印工件信息
    print(job.operations)
    print(job.name)
    print(job.mat_id)
    print(job.id)




